package com.atguigu.recursion;

/**
 * @author 龍
 * 递归的简单回顾
 * 作用：递归可以使得代码变得简洁
 * 规则：
 * 1 当程序执行到一个方法的时候，就会开辟一个独立的空间（栈）。
 * 2 每个空间的数据（局部变量），都是独立的。
 * 详细规则：
 * 1) 执行一个方法时，就创建一个新的受保护的独立空间(栈空间)
 * 2) 方法的局部变量是独立的，不会相互影响, 比如 n 变量
 * 3) 如果方法中使用的是引用类型变量(比如数组)，就会共享该引用类型的数据.
 * 4) 递归 必须向退出递归的条件逼近，否则就是无限递归,出现 StackOverflowError，死龟了:)
 * 5) 当一个方法执行完毕，或者遇到 return，就会返回， 遵守谁调用，就将结果返回给谁，同时当方法执行完毕或
 * 者返回时，该方法也就执行完毕
 */
public class RecursionTest {
    public static void main(String[] args) {
        //输出结果：2，3，4，理解栈，方法的调用，递归
        test(4);
        int result = factorial(3);
        System.out.println("result="+result);
        System.out.println(1^1^0^1);
    }

    /**
     * test测试方法
     * @param n 输入的数
     */
    public static void test(int n){
        if (n > 2){
            test(n-1);
        }
        System.out.println("n="+n);
    }

    /**
     * 阶乘的计算。
     * @param n 需要计算的数
     * @return 继承计算结果
     */
    public static int factorial(int n){
        if(n == 1){
            return 1;
        }else {
            return factorial(n - 1) * n;
        }
    }
}
